<?php
/**
 * @author jonathan <jo.link.noir@gmail.com>
 * @version 1.0: jo_link_noir
 * @date 16-06-2010
 */

/**
 * Classe de transport de ressource
 */
class U1_Move_Transport extends SW_Move_Transport
{
	/** @var string*/
	protected $orderName = 'transport';


	/**
	 * @param int $endPoint
	 * @param SW_Removable $removable = null
	 * @param int $time = null
	 */
	public function __construct($endPoint, SW_Removable $removable = null, $time = null)
	{
		parent::__construct($endPoint, null, null, $time);
		if ($removable)
			$this->addRemovable($removable);
	}

	/**
	 * Méthode à déclencher quand l'armé est arrivé à destination
	 * @param SW_Units $units
	 */
	public function arrive(SW_Units $units)
	{
		if (($planetEnd = U1_DAO_Planet::selectId($this->endPoint))
		 && $this->process($units, $planetEnd->getRefUser()))
		{
			$this->depose($units);
			U1_DAO_Move::deleteId($this->id);
		}
		else
			U1_DAO_Move::baseSend($units, $this);
	}

	/**
	 * @param SW_Units $units
	 * @param int $refUser : id du joueur de la planète cible
	 * @return bool : true si la flotte doit être détruite et les objets déposée ($this->depose). false si la flotte doit revenir.
	 */
	protected function process(SW_Units $units, $refUser)
	{
		if ($refUser)
		{
			$this->depose($units);
			$this->sendMessage(null);
		}
		return false;
	}

	/**
	 * Vérifie si l'option pour rnvoyer le message est activée. La section est message et une des clef entre : "transport", "base" et "colonize". Si c'est un mouvement entre planète la clef "intern" et utilisé avec un et binaire. Si les option n'existe pas elles sont activée.
	 * @param int $id_player
	 * @param bool $internMove
	 * @return bool
	 */
	final protected function activatedMessage($id_player, $internMove)
	{
		return ($player = U1_DAO_User::select($this->player_sends))
			? $player->getOption('message', $this->orderName, true)
			 && ($internMove ? $player->getOption('message', 'intern', true) : true)
			: false;
	}

	/**
	 * @param SW_Units $units = null
	 * @param bool $colonize = false : ordre de colonisation
	 */
	final protected function sendMessage(SW_Units $units = null, $colonize = false)
	{
		$internMove = ($this->player_sends === $this->player_target);
		$pSend = $this->activatedMessage($this->player_sends, $internMove);
		$pTarget = ($colonize || $internMove)
			? false
			: $this->activatedMessage($this->player_target);

		if ($pSend || $pTarget)
		{
			$date = new DateTime('@'.$this->time, new DateTimeZone('Europe/Paris'));

			$message = U1_Display_Move::getReportTransport(
				U1_DAO_Planet::selectId($this->startPoint),
				U1_DAO_Planet::selectId($this->endPoint),
				$units,
				$this->getRemovable('U1_Removable_Resource'),
				$colonize
			);

			if ($pTarget)
				U1_DAO_Message::send($this->player_target, $message, U1_Display_Move::getSujetMove($this->orderName, true), false, $date);

			if ($pSend)
				U1_DAO_Message::send($this->player_sends, $message, U1_Display_Move::getSujetMove($this->orderName, false), false, $date);
		}
	}
}